﻿#include <QtWidgets/QApplication>
#include <QMessageBox>
#include <Windows.h>
#include <DbgHelp.h>
#include <string>
#include <ctime>
#include "mainwindow.h"
#include "common_log.h"
//#include "componentmanager.h"
//#include "systemstate.h"
//#include "../SystemConfiguration/systemconfiguration.h"

#pragma comment(lib, "DbgHelp.lib")  // 确保链接DbgHelp库

// 定义Dump文件保存路径
const std::wstring DUMP_DIR = L"C:\\CrashDumps\\";
const std::wstring DUMP_PREFIX = L"Robot_Crash_";

// 生成Dump的核心函数
void GenerateDump(EXCEPTION_POINTERS* pExceptionInfo) {
	// 创建Dump目录（如果不存在）
	CreateDirectoryW(DUMP_DIR.c_str(), NULL);

	// 生成时间戳文件名
	std::time_t t = std::time(nullptr);
	wchar_t timestamp[20];
	std::wcsftime(timestamp, sizeof(timestamp), L"%Y%m%d_%H%M%S", std::localtime(&t));
	std::wstring dumpPath = DUMP_DIR + DUMP_PREFIX + timestamp + L".dmp";

	// 创建Dump文件
	HANDLE hDumpFile = CreateFileW(
		dumpPath.c_str(),
		GENERIC_WRITE,
		0,
		NULL,
		CREATE_ALWAYS,
		FILE_ATTRIBUTE_NORMAL,
		NULL
	);

	if (hDumpFile == INVALID_HANDLE_VALUE) {
		// 错误处理：无法创建文件
		return;
	}

	// 填充MINIDUMP_EXCEPTION_INFORMATION结构
	MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
	dumpInfo.ThreadId = GetCurrentThreadId();
	dumpInfo.ExceptionPointers = pExceptionInfo;
	dumpInfo.ClientPointers = TRUE;

	// 生成完整内存转储（可调整参数）
	BOOL success = MiniDumpWriteDump(
		GetCurrentProcess(),
		GetCurrentProcessId(),
		hDumpFile,
		static_cast<MINIDUMP_TYPE>(
			MiniDumpNormal |                  // 基本信息
			MiniDumpWithDataSegs |            // 数据段
			MiniDumpWithHandleData |          // 句柄信息
			MiniDumpWithFullMemoryInfo |      // 完整内存信息
			MiniDumpWithThreadInfo |          // 线程信息
			MiniDumpWithUnloadedModules       // 已卸载模块
			),
		&dumpInfo,
		NULL,
		NULL
	);

	CloseHandle(hDumpFile);

	if (!success) {
		// 错误处理：Dump生成失败
		DWORD err = GetLastError();
		// 可记录错误码 err
	}
}

// 异常处理函数
LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS* pExceptionInfo) {
	GenerateDump(pExceptionInfo);
	return EXCEPTION_EXECUTE_HANDLER;  // 结束进程
}
// 初始化异常捕获
void SetupExceptionHandler() {
	SetUnhandledExceptionFilter(ExceptionHandler);  // 捕获未处理异常
}

int main(int argc, char* argv[])
{
	SetupExceptionHandler();
	//SetConsoleOutputCP(CP_UTF8);
	QApplication app(argc, argv);
	Logger::GetInstance()->Init();
	log_info("--------------机械手上位机程序启动 Program Start----------------------");
	MainWindow w;
	w.show();

	app.exec();
	log_info("--------------机械手上位机程序结束 Program end----------------------");
	//system("pause");
	return 0;
}
